package main

import (
	"flag"
	"github.com/gin-gonic/gin"
	"github.com/go-ini/ini"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"github.com/sirupsen/logrus"
	"os"
)

var log = logrus.New()
var config *ini.File

// Format 日志格式化
func setupLogger(logLevel string) {
	formatter := &logrus.TextFormatter{
		FullTimestamp:   true,
		TimestampFormat: "2006-01-02 15:04:05",
	}
	log.SetFormatter(formatter)
	// 设置输出目标为标准输出
	log.SetOutput(os.Stdout)

	if logLevel == "" {
		// 默认日志级别
		logLevel = "debug"
	}

	level, err := logrus.ParseLevel(logLevel)
	if err == nil {
		log.SetLevel(level)
		log.Infof("日志级别: %s", level.String())
	} else {
		log.Errorf("日志级别解析失败: %v", err)
		// 如果解析失败，设置为 Debug
		log.SetLevel(logrus.DebugLevel)
	}
}

// Init 应用初始化
func Init(configPath string) {
	if configPath == "" {
		log.Fatalf("必须提供配置文件路径！使用 -config 指定.")
	}
	// 检查配置文件是否存在和可读
	_, err := os.Stat(configPath)
	if err != nil {
		if os.IsNotExist(err) {
			log.Fatalf("配置文件不存在: %v", err)
		} else if !os.IsPermission(err) {
			log.Fatalf("无法访问配置文件: %v", err)
		}
	}

	// 加载配置文件并存储在全局变量中
	config, err = ini.Load(configPath)
	if err != nil {
		log.Fatalf("加载配置文件失败: %v", err)
	}

	logLevel, err := GetConfig("default", "logLevel")
	if err != nil {
		log.Errorf("读取日志级别配置失败: %v", err)
		logLevel = "debug" // 默认日志级别
	}
	// 设置日志级别
	setupLogger(logLevel)

	metricStatus, err := GetConfig("default", "metric")
	if err != nil {
		log.Errorf("读取指标配置失败: %v", err)
		metricStatus = "false" // 默认不启用指标
	}
	if metricStatus == "true" {
		// 注册 Prometheus 监控指标
		prometheus.MustRegister(ruleMetric)
	}
	CheckYaml()
	rules, err := ReadRuleFile()
	cacheMutex.Lock()
	for _, rule := range rules {
		rulesCache[rule.Alert] = rule
	}
	cacheMutex.Unlock()
	GenerateLog(1000)
	EsIndexInit()
	CronTask()
	// 初始化时加载现有的活跃告警到缓存中
	loadActiveAlertsToCache()
	go NotificationFrequencyControl()
}

func main() {
	// 解析命令行参数
	configPath := flag.String("config", "", "配置文件路径")
	flag.Parse()
	log.Println("应用初始化...")
	Init(*configPath)

	// 使用 Gin 设置访问的路由
	r := gin.New()

	// 手动添加 Logger 和 Recovery 中间件
	r.Use(gin.Logger())
	r.Use(gin.Recovery())

	// Prometheus 监控路由
	r.GET("/metric", gin.WrapH(promhttp.Handler()))
	// 规则加载 API 路由
	r.POST("/load-rules", LoadRulesAPIHandler)
	// 首页路由
	r.GET("/", Primary)

	// 获取配置中的端口并启动服务
	port, err := GetConfig("default", "port")
	if err != nil {
		log.Fatalf("读取端口配置失败: %v", err)
	}
	portStr := ":" + port

	// 启动 Gin HTTP 服务
	if err := r.Run(portStr); err != nil {
		log.Fatalf("启动ESAlert服务失败: %v", err)
	} else {
		log.Printf("ESAlert启动成功, 端口 %s", port)
	}
}
